import Model from '../ModelAlgorithm'

// 我认为这是较为直观的写法
// 但不优雅也不简洁，性能还超级低
function algorithm_no_elegant(arr) {
  var ordered = []
  for (var i = 0; i < arr.length; i++) {
    if (i === 0) {
      ordered.push(arr[i])
      continue
    }

    var flag = false
    for (var j = 0; j < ordered.length; j++) {
      if (arr[i] < ordered[j]) {
        // 插入
        ordered.splice(j, 0, arr[i])
        flag = true
        break
      }
    }

    if (!flag) {
      // 没有找到则在尾部插入
      ordered.push(arr[i])
    }
    console.log(ordered)
  }
  return ordered
}

// 这是网上找来的算法
// preIndex在一定程度上反映了整个插排的进度
// preIndex-- 代表了向前查找
//
function algorithm(arr) {
  console.log('当前调用插入排序：')
  
  var len = arr.length
  var preIndex, current

  for (var i = 1; i < len; i++) {
    preIndex = i - 1
    current = arr[i]
    while (preIndex >= 0 && arr[preIndex] > current) {
      arr[preIndex + 1] = arr[preIndex]
      preIndex--
    }
    arr[preIndex + 1] = current
    console.log(arr)
  }
  return arr
}

function description() {
  return {
    title: '插入排序(Insertion)',
    desc: [
      '构造有序序列',
      '对于未排序数据，在已排列序列中扫描，找到相应位置并插入',
      '是你打扑克牌时用的排序法',
    ],
  }
}

export default (runner) => {
  const entity = new Model(algorithm, description())
  runner.injectAlgorithm('insertion', entity)
}
